//
//  NetWorkHandler.m
//  UI18_网络请求
//
//  Created by 石美妮 on 15/12/31.
//  Copyright © 2015年 www.lanou3g.com蓝鸥科技. All rights reserved.
//

#import "NetWorkHandler.h"

@implementation NetWorkHandler

+(void)GETWithURL:(NSString *)str completion:(NETBLOCK)netBlock
{
    // 中文转码
    NSString *newStr = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:str]];
    // url
    // 不识别中文,故网址需要转码
    NSURL *url = [NSURL URLWithString:newStr];
    // url->request
    // 参数1:URL
    // 参数2:缓存
    // 参数3:超时,一般设置为60s.
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    // 建立连接
    NSURLSession *session = [NSURLSession sharedSession];
    // 建立任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            //JSON 解析中 data 不能为 nil
            // error 存在, 请求出错,data 为空.否则存在 data 数据, error 为空
            if (error) {
                NSLog(@"错误信息:%@", error);
            }else {
                NSError *jError = nil;
                id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jError];
                if (jError) {
                    NSLog(@"错误信息:%@", jError);
                } else {
                    // 向外部返回 JSON 数据
                    netBlock(result);
                }
            }
        });
    }];
    [task resume];
}
+(void)POSTWithURL:(NSString *)str body:(NSData *)body completion:(NETBLOCK)netBlock
{
    // 中文转码
    NSString *newStr = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:str]];
    // url
    // 不识别中文,故网址需要转码
    NSURL *url = [NSURL URLWithString:newStr];
    // url->request
    // 参数1:URL
    // 参数2:缓存
    // 参数3:超时,一般设置为60s.
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    // POST
    request.HTTPMethod = @"POST";
    // body
    request.HTTPBody = body;
    // 建立连接
    NSURLSession *session = [NSURLSession sharedSession];
    // 建立任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            //JSON 解析中 data 不能为 nil
            // error 存在, 请求出错,data 为空.否则存在 data 数据, error 为空
            if (error) {
                NSLog(@"错误信息:%@", error);
            }else {
                NSError *jError = nil;
                id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jError];
                if (jError) {
                    NSLog(@"错误信息:%@", jError);
                } else {
                    // 向外部返回 JSON 数据
                    netBlock(result);
                }
            }
        });
    }];
    [task resume];
}

// 封装:把重复的地方提取公因式
// 把重复的代码只写一次,以后反复使用.

// 封装的原因
// 1.简化代码(偷懒)
// 2.提高代码的扩展性和可重用性

// 封装的标志
// 复制/粘贴 重复使用的代码

// 封装的方式
// 1.方法封装(自适应 Cell 高度)
// 重复代码写在一个方法中,当前类和一个相关联类中使用
// 2.类封装(网络请求/ Model 类)
// 把重复代码写在类中,多个类/工程中都可以使用
// 3.类目封装(字符串倒序/获取拼音)
// 给已经存在的类(系统)写扩展

// 封装的要求
// 1.内存管理
// 2.返回值和参数,规划哪些是必须得,哪些是可选的.
// 3.安全性 自身保证不会处问题
// 4.扩展性 封装是一个可以长期提高优化的方式


@end
